\subsubsection{Łatanie (patching) adresów (Win64)}

Jeśli nasz przykład jest skompilowany w MSVC2013 z opcją \TT{\textbackslash{}MD}
(mniejszy plik wykonywalny poprzez zewnętrzne związywanie pliku \TT{MSVCR*.DLL}),
funkcja \main idzie jako pierwsza i bardzo łatwo ją znaleźć:

\begin{figure}[H]
\centering
\myincludegraphics{patterns/01_helloworld/hiew_incr1.png}
\caption{Hiew}
\label{}
\end{figure}

Możemy, na przykład, spróbować \glslink{increment}{inkrementować} adres:

\begin{figure}[H]
\centering
\myincludegraphics{patterns/01_helloworld/hiew_incr2.png}
\caption{Hiew}
\label{}
\end{figure}

Hiew pokazuje \q{ello, world}.
I kiedy my uruchamiamy plik wykonywalny, właśnie ta linia jest zwracana.

\subsubsection{Wybór innej linii z pliku wykonywalnego (Linux x64)}

Plik wykonywalny, jeśli jego się kompiluje korzystając z GCC 5.4.0 na Linux x64, ma mnóstwo innych linii:
głównie są to nazwy importowanych funkcjii oraz nazwy bibliotek.

Uruchamiamy objdump, żeby podejrzeć zawartość zawartość wszystkich sekcji skompilowanego pliku:

\begin{lstlisting}
% objdump -s a.out

a.out:     file format elf64-x86-64

Contents of section .interp:
 400238 2f6c6962 36342f6c 642d6c69 6e75782d  /lib64/ld-linux-
 400248 7838362d 36342e73 6f2e3200           x86-64.so.2.
Contents of section .note.ABI-tag:
 400254 04000000 10000000 01000000 474e5500  ............GNU.
 400264 00000000 02000000 06000000 20000000  ............ ...
Contents of section .note.gnu.build-id:
 400274 04000000 14000000 03000000 474e5500  ............GNU.
 400284 fe461178 5bb710b4 bbf2aca8 5ec1ec10  .F.x[.......^...
 400294 cf3f7ae4                             .?z.

...
\end{lstlisting}

Przekazanie adresu linii zawierającej tekst \q{/lib64/ld-linux-x86-64.so.2} do wywołania \TT{printf()} nie jest dużym problemem:

\begin{lstlisting}[style=customc]
#include <stdio.h>

int main()
{
    printf(0x400238);
    return 0;
}
\end{lstlisting}

Ciężko uwierzyć, ale ten kod wyprintuje tę linię.

Jeśli zmienić adres na \TT{0x400260}, to wyprintuje się linia \q{GNU}.
Adres jest dokładny dla konkretnej wersji GCC, GNU toolset, itd.
W waszym systemie plik wykonywalny może wyglądać trochę inaczej, i wszystkie adresy też będą inne.
Także usuwanie/dodawanie kodu z kodu źródłowego może przesunąć wszystkie adresy do przodu lub do tyłu.


